#include "Administrador.h"
#include "cstring"

using namespace std;
Administrador::Administrador() {

}

void Administrador::CambiarTurno(char dniDoctor[], int turno) {
	Doctor d;

	Doctor *ds = BuscarSupervisor(turno);

	ofstream fOut("AuxDoctores.dat", ios::app | ios::binary);
	ifstream fIn("Doctores.dat");

	if (!fIn) {
		cout << "\nError al abrir Doctores.dat";
	} else {
		fIn.read(reinterpret_cast<char *>(&d), sizeof(Doctor));
		while (!fIn.eof()) {
			if (strcmp(d.dni, dniDoctor) == 0) {
				d.turno = turno;
				if (ds != NULL) {
					strcpy(d.dniSupervisor, ds->dni);
				} else {
					strcpy(d.dniSupervisor, d.dni);
				}
			}
			fOut.write(reinterpret_cast<char *>(&d), sizeof(Doctor));
			fIn.read(reinterpret_cast<char *>(&d), sizeof(Consulta));
		}
		fIn.close();
		fOut.close();
	}
	remove("Doctores.dat");
	rename("AuxDoctores.dat", "Doctores.dat");
}

Doctor* Administrador::BuscarSupervisor(int turno) {
	Doctor *d = new Doctor();

	ifstream fIn("Doctores.dat", ios::in | ios::binary);
	if (fIn) {
		fIn.read(reinterpret_cast<char *>(d), sizeof(Doctor));
		while (!fIn.eof()) {
			if (d->turno == turno && strcmp(d->dni, d->dniSupervisor) == 0) {
				return d;
			}
			fIn.read(reinterpret_cast<char *>(d), sizeof(Doctor));
		}
		fIn.close();
	}

	return NULL;
}

void Administrador::CambiarSupervisor(char dniSupervisor[], int turno) {
	Doctor d;

	ofstream fOut("AuxDoctores.dat", ios::app | ios::binary);
	ifstream fIn("Doctores.dat");

	if (!fIn) {
		cout << "\nError al abrir Doctores.dat";
	} else {
		fIn.read(reinterpret_cast<char *>(&d), sizeof(Doctor));
		while (!fIn.eof()) {
			if (d.turno == turno) {
				strcpy(d.dniSupervisor, dniSupervisor);
			}
			fOut.write(reinterpret_cast<char *>(&d), sizeof(Doctor));

			fIn.read(reinterpret_cast<char *>(&d), sizeof(Consulta));
		}
		fIn.close();
		fOut.close();
	}
	remove("Doctores.dat");
	rename("AuxDoctores.dat", "Doctores.dat");
}

Doctor* Administrador::BuscarDoctor(char dni[]) {
	Doctor *d = new Doctor();

	ifstream fIn("Doctores.dat");
	if (fIn) {
		fIn.read(reinterpret_cast<char *>(d), sizeof(Doctor));
		while (!fIn.eof()) {
			if (strcmp(d->dni, dni) == 0) {
				return d;
			}
			fIn.read(reinterpret_cast<char *>(d), sizeof(Doctor));
		}
		fIn.close();
	}
	return NULL;
}

void Administrador::AgregarDoctor(char dni[], char nombre[], int edad,
		char direccion[], int turno, char dniSupervisor[]) {
	Doctor *d = new Doctor(dni, nombre, edad, direccion, turno, dniSupervisor);

	if (this->BuscarDoctor(dni) == NULL) {
		ofstream esc("Doctores.dat", ios::app | ios::binary);
		esc.write(reinterpret_cast<char *>(d), sizeof(Doctor));
		esc.close();
	} else {
		cout << "\nEl dni ya esta registrado" << endl;
	}

}

Paciente* Administrador::BuscarPaciente(char dni[]) {
	Paciente *p = new Paciente();

	ifstream fIn("Pacientes.dat");
	if (fIn) {
		fIn.read(reinterpret_cast<char *>(p), sizeof(Paciente));
		while (!fIn.eof()) {
			if (strcmp(p->dni, dni) == 0) {
				return p;
			}
			fIn.read(reinterpret_cast<char *>(p), sizeof(Paciente));
		}
		fIn.close();
	}

	return NULL;
}

void Administrador::AgregarPaciente(char dni[], char nombre[], int edad,
		char direccion[]) {
	Paciente *p = new Paciente(dni, nombre, edad, direccion);

	if (BuscarPaciente(dni) == NULL) {
		ofstream esc("Pacientes.dat", ios::app | ios::binary);
		if (esc) {
			esc.write(reinterpret_cast<char *>(p), sizeof(Paciente));
			esc.close();
		}
	} else {
		cout << "\nEl dni ya esta registrado" << endl;
	}
}

void Administrador::GuardarConsulta(char dniDoctor[], char dniPaciente[],
		char dolencia[], char* receta) {
	Consulta *c = new Consulta(dniDoctor, dniPaciente, dolencia, receta);

	ofstream esc("Consultas.dat", ios::app | ios::binary);
	if (!esc) {
		cout << "\n ERROR al abrir Consultas.dat";
	} else {
		esc.write(reinterpret_cast<char *>(c), sizeof(Consulta));
		esc.close();
	}
}

void Administrador::RecuperarHistoriaClinica(char dniPaciente[]) {
	Paciente *p = BuscarPaciente(dniPaciente);
	if (p != NULL) {
		Consulta c;
		ifstream fIn("Consultas.dat", ios::in | ios::binary);
		if (fIn) {
			fIn.read(reinterpret_cast<char *>(&c), sizeof(Consulta));
			cout << "Historia Clinica" << endl;
			while (!fIn.eof()) {
				if (strcmp(c.dniPaciente, dniPaciente) == 0) {
					cout << "#################################################"
							<< endl;
					c.Imprimir();
					cout << "#################################################"
							<< endl;
				}
				fIn.read(reinterpret_cast<char *>(&c), sizeof(Consulta));
			}
			fIn.close();
		} else {
			cout << "Aun no se ha registrado ninguna consulta" << endl;
		}
	} else {
		cout << "No se encuentra registrado a este paciente" << endl;
	}
}

void Administrador::ListarDoctorPorTurno(int turno) {
	ifstream fIn("Doctores.dat");
	Doctor d;
	if (!fIn) {
		cout << "\nError al abrir Doctores.dat";
	} else {

		cout << "Docotor(es) del Turno: ";
		switch (turno) {
		case 1:
			cout << "Manana" << endl;
			break;
		case 2:
			cout << "Tarde" << endl;
			break;
		case 3:
			cout << "Noche" << endl;
			break;
		}
		fIn.read(reinterpret_cast<char *>(&d), sizeof(Doctor));
		while (!fIn.eof()) {
			if (d.turno == turno) {
				cout << "#################################################"
						<< endl;
				d.Imprimir();
				cout << "#################################################"
						<< endl;
			}
			fIn.read(reinterpret_cast<char *>(&d), sizeof(Doctor));
		}
		fIn.close();
	}
}

void Administrador::Reporte1() {
	cout << "Reporte de doctores" << endl;
	for (int t = 0; t < 3; ++t) {
		ListarDoctorPorTurno(t);
	}

}

void Administrador::Reporte2(int turno, char * dniPaciente) {

	Paciente *p = BuscarPaciente(dniPaciente);
	if (p != NULL) {
		RecuperarHistoriaClinica(dniPaciente);
	} else {
		cout << "El dni no corresponde a un Paciente" << endl;
	}

}

void Administrador::Reporte3(int turno) {
	Doctor doctor;
	Paciente *paciente;
	Consulta consulta;

	int k;
	ifstream fInd("Doctores.dat", ios::in | ios::binary);
	if (fInd) {
		fInd.read(reinterpret_cast<char *>(&doctor), sizeof(Doctor));
		while (!fInd.eof()) {
			k = 0;
			cout << "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"<< endl;
			doctor.Imprimir();
			cout << "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"<< endl;
			ifstream fInc("Consultas.dat", ios::in | ios::binary);
			fInc.read(reinterpret_cast<char *>(&consulta), sizeof(Consulta));
			if (fInc) {
				while (!fInc.eof()) {
					if (strcmp(consulta.dniDoctor, doctor.dni) == 0) {
						paciente = BuscarPaciente(consulta.dniPaciente);
						cout << "#################################################"
												<< endl;
						paciente->Imprimir();
						cout << "#################################################"
												<< endl;
						k++;
					}
					fInc.read(reinterpret_cast<char *>(&consulta),
							sizeof(Consulta));
				}
				cout << "Atenciones: " << k << endl;

				fInc.close();
			}
			fInd.read(reinterpret_cast<char *>(&doctor), sizeof(Doctor));
		}
		fInd.close();
	}
}

Administrador::~Administrador() {
// TODO Auto-generated destructor stub
}

